package com.omt.tarjimdinek.domain.translate.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;

import org.apache.log4j.Logger;

import com.google.common.base.Objects;
import com.omt.tarjimdinek.domain.poll.entity.Vote;
import com.omt.tarjimdinek.domain.islamicLibrary.entity.Sahabi;
import com.omt.tarjimdinek.domain.member.entity.Membre;
import com.omt.tarjimdinek.support.Identifiable;

/**
 * translate line
 * @author chabane
 *
 */
@Entity
@Table(name="a01_lgntrd")
public class LigneTraduction implements Identifiable<Long>, Serializable{

    private static final long serialVersionUID = 1L;
    private static final Logger log = Logger.getLogger(LigneTraduction.class);
    
	/** ID SGBD */
	@Column(name="CNLGNTRD", length=11)
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(name = "VERSION", precision = 10)
	@Version
	private Integer version;
	
	/** content of line */
	@JoinColumn(name="CNLGN", nullable=false)
	@NotNull
	private Ligne traduction;
	
	/** list of translations */
	@OneToMany(fetch=FetchType.LAZY, mappedBy="ligneTraduction")
	private List<HistoriqueCorrection> listeHistoriquesCorrections;
	
	/** list of polls */
	@OneToMany(fetch=FetchType.LAZY, mappedBy="ligneTraduction")
	private List<Vote> listeVotes;
	
	/** translator */
	@JoinColumn(name="CNMBR", nullable=false)
	@NotNull
	private Membre traducteur;
	
	/** patch validated */
	@JoinColumn(name="CNHSTCTN", nullable=false)
	@OneToOne(cascade=CascadeType.ALL, mappedBy="ligneTraduction")
	private HistoriqueCorrection correctifValide;
	
	/** validator */
	@JoinColumn(name="CNMBR2", nullable=false)
	@NotNull
	private Membre validateur;
	
	/** define if line is validated */
	@Column(name="BOVLD")
	private Boolean valide;
	
	/** originale translation */
	@JoinColumn(name="CNLGNORG", nullable=false)
	@OneToOne
	private LigneOriginale ligneOriginale;
	

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getVersion() {
		return version;
	}

	public void setVersion(Integer version) {
		this.version = version;
	}
	
	public Ligne getTraduction() {
		return traduction;
	}

	public void setTraduction(Ligne traduction) {
		this.traduction = traduction;
	}

	public List<HistoriqueCorrection> getListeHistoriquesCorrections() {
		return listeHistoriquesCorrections;
	}

	public void setListeHistoriquesCorrections(
			List<HistoriqueCorrection> listeHistoriquesCorrections) {
		this.listeHistoriquesCorrections = listeHistoriquesCorrections;
	}

	public List<Vote> getListeVotes() {
		return listeVotes;
	}

	public void setListeVotes(List<Vote> listeVotes) {
		this.listeVotes = listeVotes;
	}

	public Membre getTraducteur() {
		return traducteur;
	}

	public void setTraducteur(Membre traducteur) {
		this.traducteur = traducteur;
	}

	public HistoriqueCorrection getCorrectifValide() {
		return correctifValide;
	}

	public void setCorrectifValide(HistoriqueCorrection correctifValide) {
		this.correctifValide = correctifValide;
	}

	public Membre getValidateur() {
		return validateur;
	}

	public void setValidateur(Membre validateur) {
		this.validateur = validateur;
	}

	public Boolean getValide() {
		return valide;
	}

	public void setValide(Boolean valide) {
		this.valide = valide;
	}

	public LigneOriginale getLigneOriginale() {
		return ligneOriginale;
	}

	public void setLigneOriginale(LigneOriginale ligneOriginale) {
		this.ligneOriginale = ligneOriginale;
	}

	@Transient
	public boolean isIdSet() {
		return id != null && id.compareTo(Long.valueOf(0)) != 0;
	}
	
	/**
     * equals implementation using a business key.
     */
    public boolean equals(Object other) {
        return this == other || (other instanceof Sahabi && hashCode() == other.hashCode());
    }

    public int hashCode() {
        int hashCode = Objects.hashCode(getId());
        return hashCode;
    }
    
    /**
     * Construct a readable string representation for this instance.
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return Objects.toStringHelper(this) //
                .add("id", getId()) //
                .add("correctifValide", getCorrectifValide()) //
                .add("demandeTraduction", getTraduction()) //
                .add("ligneOriginale", getLigneOriginale()) //
                .add("listeHistoriquesCorrections", getListeHistoriquesCorrections()) //
                .add("listeVotes", getListeVotes()) //
                .add("traducteur", getTraducteur()) //
                .add("valide", getValide()) //
                .add("validateur", getValidateur()) //
                .add("version", getVersion()) //
                .toString();
    }
}
